﻿// ===============================================================================
//  Copyright © ymind.net. All rights reserved .
//  官方网站：http://ymind.net/
//  版权所有：彦铭工作室 老陈出品
// ===============================================================================

using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Builders;

namespace Lcsoft.Data.MongoDB
{
	/// <summary>
	/// 为标识符类型为 <see cref="int"/> 的对象的数据访问层提供基类。
	/// </summary>
	public abstract class BsonInt32ObjectDALBase<T> : AutoIncrementIdObjectDALBase<T, int>
	{
		/// <summary>
		/// 初始化 <see cref="BsonInt32ObjectDALBase{T}"/> 对象。
		/// </summary>
		/// <param name="masterGroup">主机连接字符串的分组名称。</param>
		protected BsonInt32ObjectDALBase(string masterGroup) : base(masterGroup) { }

		/// <summary>
		/// 初始化 <see cref="BsonInt32ObjectDALBase{T}"/> 对象。
		/// </summary>
		/// <param name="masterGroup">主机连接字符串的分组名称。</param>
		/// <param name="slaveGroup">从机连接字符串的分组名称。</param>
		protected BsonInt32ObjectDALBase(string masterGroup, string slaveGroup) : base(masterGroup, slaveGroup) { }

		/// <summary>
		/// 返回新的唯一标识符。
		/// </summary>
		/// <param name="database">保存唯一标识符的数据库对象。</param>
		/// <returns>返回表示唯一标识符的 <see cref="BsonInt64"/>。</returns>
		protected override int GetNewId(MongoDatabase database)
		{
			var collection = this.GetCollection(this.AutoIncrementCollectionName);
			var resutl = collection.FindAndModify(Query.EQ(this.IdName, this.CollectionName), SortBy.Null, Update.Inc("Index", 1), true, true);

			return resutl.ModifiedDocument["Index"].ToInt32();
		}
	}
}
